import java.util.Scanner;
public class HashList{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //哈希表--》外层是个数组，里面是链表(不带头结点)，链表里的每个节点都存有信息
        HashListMethod hashList=new HashListMethod(3);//创建3条链表
        while(true){
            Menu(hashList);
        }

    }
    public static void Menu(HashListMethod hashList){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要进行的操作：1《添加》，2《查找》，3《删除》，4《修改》，5《遍历》，6《退出》");
        int choice=sc.nextInt();
        switch (choice){
            case 1->hashList.addToList();
            case 2->hashList.FindLinkedList();
            case 3->hashList.DelLinkedNode();
            case 4-> hashList.ModifyLinked();
            case 5->hashList.PrintLinkedList();
            default->System.exit(0);//停止虚拟机的运行
        }

    }
}

class HashListMethod{
    //创建放三条链表的数组。0,1,2
    private LinkedList[] linkedListArray;
    private int size;//数组内链表的个数

    //构造器
    public HashListMethod(int size){
        this.size=size;
        linkedListArray=new LinkedList[size];//初始化数组
        for (int i = 0; i < size; i++) {//初始化链表
            linkedListArray[i]=new LinkedList();
        }
    }
    //添加
    public void addToList(){
       /* Scanner sc=new Scanner(System.in);
        System.out.println("请输入要添加的人数：");
        int number=sc.nextInt();
        for (int i = 0; i < number; i++) {*/
           /* System.out.println("请输入编号:");
            int num=sc.nextInt();
            System.out.println("请输入姓名：");
            String name=sc.next();
            System.out.println("请输入年龄：");
            int age=sc.nextInt();
            LinkedNode node=new LinkedNode(num,name,age);
            //获取添加到的链表的索引
            int index=LinkedListIndex(num);
            //添加节点到链表上
            linkedListArray[index].add(node);*/

            LinkedNode node1=new LinkedNode(9,"王二",13);
            LinkedNode node2=new LinkedNode(27,"张三",13);
            LinkedNode node3=new LinkedNode(81,"沈涵",13);
            int index1=LinkedListIndex(9);
            int index2=LinkedListIndex(27);
            int index3=LinkedListIndex(81);
            linkedListArray[index1].add(node1);
            linkedListArray[index2].add(node2);
            linkedListArray[index2].add(node3);

        System.out.println("添加成功！");

    }
    //修改链表上的结点信息
    public void ModifyLinked(){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要修改的结点的编号：");
        int num=sc.nextInt();
        int index=LinkedListIndex(num);
        linkedListArray[index].modify(num);
    }
    //查找链表上的结点信息
    public void FindLinkedList(){
        Scanner sc=new Scanner(System.in);
        boolean flag=false;
        System.out.println("请输入要查找的编号：");
        int num=sc.nextInt();
        for (int i = 0; i < size; i++) {
            if(linkedListArray[i].Find(num)){
                flag=true;
                break;
            }
        }
        if(!flag){
            System.out.println("不存在该学生！");
        }
    }
    //删除某条链表上的结点
    public void DelLinkedNode(){
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入要删除的编号：");
        int num=sc.nextInt();
        //获取节点上的编号
        int index= LinkedListIndex(num);
        linkedListArray[index].DelNode(num);
    }

    //遍历所有链表
    public void PrintLinkedList(){
        for (int i = 0; i < size; i++) {
            linkedListArray[i].Print();
        }

    }
    //添加到哪个链表
    public int LinkedListIndex(int num){
        return num%size;
    }




}
class LinkedList{
    //创建的是不带头结点的单链表
    private LinkedNode head;//指向第一个结点的指针

    //添加节点
    public void add(LinkedNode node){
        //判断链表是否为空
        if(head==null){
            head=node;
            return;
        }
        LinkedNode p=head;
        while(p.next!=null){
            p=p.next;
        }
        //这里就是最后一个结点了
        p.next=node;
    }
    //查找节点
    public boolean Find(int num){
        LinkedNode p=head;
        while(p!=null){
            if(p.getNum()==num){
                System.out.println(p.toString());
                return true;
            }
            p=p.next;
        }
        return false;
    }
    //修改结点
    public void modify(int num){
        Scanner sc=new Scanner(System.in);
        LinkedNode p=head;
        while(p!=null){
            if(p.getNum()==num){
                System.out.println("请输入修改后的编号：");
                p.setNum(sc.nextInt());
                System.out.println("请输入修改后的姓名：");
                p.setName(sc.next());
                System.out.println("请输入修改后的年龄：");
                p.setAge(sc.nextInt());
                return;
            }
            p=p.next;
        }
        System.out.println("不存在该编号！");
    }
    //删除结点
    public void DelNode(int num){
        if(head==null){
            System.out.println("该表为空！");
            return;
        }

        if(head.num==num){//不能把head置空
            //第一个结点为空
            head=head.next;
            System.out.println("删除成功！");
            return;
        }
        LinkedNode p=head;
        //删除--最后一个结点不能使用p=p.next 最后一个结点也没找到说明该节点不存在
        //找到要删除节点的前一个节点// 9 27 81
        while(p.next!=null){
            if(p.next.getNum()==num){
                p.next=p.next.next;
                System.out.println("删除成功！");
                return;
            }
            p=p.next;
        }
        //最后一个结点
        System.out.println("该编号不存在！");
    }
    //遍历结点
    public void Print(){
        if(head==null){
            return;
        }
        LinkedNode p=head;
        while(p!=null){
            System.out.println(p.toString());
            p=p.next;
        }
    }


}
class LinkedNode{
    public int num;//编号
    public  String name;//姓名
    public int age;//年龄
    public LinkedNode next;

    public LinkedNode(int num,String name,int age){
        this.num=num;
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    @Override
    public String toString() {
        return "LinkedNode{" +
                "num='" + num + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}